package com.java.jvm.bytecode.javassist;

import javassist.*;

import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * FAQ?我们所有的.class文件都必须有对应的.java吗？
 * 基于Javassist API创建一个Point.class
 */
public class CreatePointClassTests {
    public static void main(String[] args) throws CannotCompileException, IOException, NoSuchFieldException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        //获取ClassPool对象，基于此对象可以获取CtClass对象
        ClassPool classPool = ClassPool.getDefault();
        //创建一个新的类,类名是com.java.Point
        CtClass ctClass = classPool.makeClass("com.java.Point");
        // 构建新的类的成员变量
        CtField ctFieldNew = new CtField(CtClass.intType,"x",ctClass);
        // 设置类的访问修饰符为public
        ctFieldNew.setModifiers(Modifier.PUBLIC);
        // 将属性添加到类中
        ctClass.addField(ctFieldNew);
        //创建一个新的方法
        CtMethod getXMethod =
        CtNewMethod.make("public int getX() { return this.x;}", ctClass);
        //将新的方法添加到ctClass(可选)
        ctClass.writeFile("01-java/target/classes/");//可选
    }
}
